<?php
/**
 * @Descript:基础类重写beate0.2
 * @Last Modified by:   blue
 * @Last Modified time: 2017-12-01 15:55:07
 */

namespace app\common\controller;
use aop\safe\SafeInput;
use think\Request;
use think\Session;

class Curd
{
    protected $model;
    // 分配到前台的通用变量
    protected $assign_data=[];
    //类里面引入jump类
    use \traits\controller\Jump;
    use \app\common\traits\ModelTool;
    //构造函数,初始化模型, 一般在子控制中的构造方法中创建
    public function __construct(Request $request=null){
         //模型初始化
//         $this->model=model('Curd');
         // if(method_exists($this,'isLogin'))
         if(method_exists(__CLASS__,'isLogin')){
             $this->isLogin();
         }
         // 验证权限
         if(method_exists(__CLASS__,'isAuth')){
             $this->isAuth();
         }
         // 实例化化request对象,防止多次实例化
         if(is_null($request)){
            $request=Request::instance();
         }
         $this->request=$request;
    }


    //列表前置操作
    protected function beforeListC(){ }
    
    //列表控制器方法
    public function listC(){
        //定义前置方法
        method_exists(__CLASS__, 'beforeListC')&& $this->beforeListC();
        $res=$this->model->show($where,$filds,$sort,$pagesize);
        // 如果查到数据,则分配变量,连同分页
        isset($res['data'])&&\think\View::share('data',$res);
        return view();
    }

    /**
     * 添加控制器前置操作
     */
    protected function beforeAddC(){ }
   
    //添加编辑控制器方法
    public function addC(){
        // 定义前置方法
        method_exists(__CLASS__,'beforeAddC')&& $this->beforeAddC();
	    if(Request::instance()->isPost()){
	    	$res=$this->model->add();
            ($res['status']=='success')?$this->success($res['message'],'listC'):$this->error($res['message'],'listC');
	    }
        return view();
    }
   
    /**
     * 编辑控制器前置操作
     * 一般用来分配旧数据和关联表的数据
     * @param $where GET获取的id组合形式$where['id']
     */
    protected function beforeEditC(){ }
    
    /**
     * 编辑控制器
     */
    public function editC(){
        $where[$this->pk]=intval(Request::get($this->pk));
        // 如果id存在,则取出数据.
        $old=$id&&$this->model->where($where)->find();
        //定义前置方法
        method_exists(__CLASS__,'beforeEditC')&& $this->beforeEditC();
        //存储新的数据
        if(Request::instance()->isPost()){
            $res=$this->model->edit();
            // 根据返回状态,判断跳转位置和信息
            ($res['status']=='success')?$this->success($res['message'],'listC'):$this->error($res['message'],'listC');
        }
        // 分配旧数据到编辑中
        (empty($old))||\Think\View::share('old',$old);
        return view();
    }

    //删除控制器方法
    public function delC(){
        $res=$this->model->softDel();
        ($res['status']=='success')?$this->success($res['message'],'listC'):$this->error($res['message'],'listC');
    }

     /**
      * [editData 数据处理控制器]
      * 这个放到模型中还是控制器中比较好？？？
      */
     protected function editData($formToData=[],$validateName=false,$validateScene=false,$filter='strip_tags,trim'){
        // 设置前置钩子函数
        method_exists(__CLASS__,'beforeAddC')&& $this->beforeAddC();
        method_exists(__CLASS__,'beforeEditC')&& $this->beforeEditC();
        if(Request::instance()->isPost()){
            //1.获取数据(采用必要过滤)
            $data=$this->request->param('','','strip_tags,trim');
            // 判断是否存在id
            if(isset($data[$this->pk])){
                $data[$this->pk]=intval($data[$this->pk]);
                $old=$id&&$this->model->where($where)->find();
                (empty($old))||\Think\View::share('old',$old);
            }
            //2.数据安全处理函数处理数据
            $sdata=$this->dataSafe($data,$formToData=[],$validateName=false,$filter='strip_tags,trim');
            //3.调用模型入库
            $res=$this->model->store($sdata);
            //4.根据结果反馈信息
            ($res['status']=='success')?$this->success($res['message'],'listC'):$this->error($res['message'],'listC');        
        }

     }

     /**
      * [dataSafe 数据安全处理]
      * @param  array   $saveData     [数据]
      * @param  array   $formToData   [表单字段转数据库]
      * @param  boolean $validateName [验证器名称]
      * @param  boolean $validateScene [验证器场景]
      * @param  string  $filter       [过滤方法'strip_tags,trim']
      * @return [type]                [处理后的数据]
      */
     protected function dataSafe($saveData=[],$formToData=[],$validateName=false,$validateScene=false,$filter='strip_tags,trim'){
        /*1.saveData参数空值判断*/
        $data=empty($saveData)?$this->request->post('','',$filter):$savedata;
        /*2.数据空值再次判断*/
        if(empty($data)) return $this->error('没有数据');
        /*3.表单字段to数据库字段转换*/
        if(is_array($formToData)&&!empty($formToData)){
            $data=$this->buildParam($data);
        }else{
            $data=$data;
        }
        /*4.数据进行验证器的处理*/
        if($validateName!=false){
            // 实例化验证器,并验证
            $validate=Loader::validate($validateName);
            // $validate=new $validateName;
            if(!$validate->scene($validateScene)->batch()->check($data)){
                $this->error(json_encode($validate->getError(),JSON_UNESCAPED_UNICODE));
            }
        }
        /*5.入库前的参数过滤*/
        $data=SafeInput::xssTrip($data);
        return $data;
     }

      /**
      * [buildParam 表单字段和数据库字段的转换]
      * @param  array  $array [键名为数据库字段,键值为表单字段]
      * @return [type]        [description]
      * 
      */
    protected function buildParam($array=[]){
        $data=Request::instance()->param();
        if(is_array($array)&&!empty($array)){
            foreach ($array as $key => $value) {
                $data[$key]=$data[$value];
                unset($data[$value]);
            }
        }
        return $data;
     }

}
